"""
爬取豆瓣电影 ajax 排行榜分页：

如何寻找 ajax 网站的 api接口？
向下拉动页面，使 ajax 多次加载，可以寻找到 api

通过拉动页面，ajax 自动加载后，发现只有 data 中的 start 属性改变，所以通过改变 这个属性可以实现 ajax 分页下载：
 规律：
 第一页 start = 0
 第二页 start = 20
 第三页 start = 40
 第n页 start = (n - 1) * 20

 当然，也可以通过自定义输入 影视类型、评分等来选择下载数据。
"""

import urllib.request
import urllib.parse


def create_request(range):
	url = 'https://movie.douban.com/j/new_search_subjects?'

	data = {
		'sort': 'S',
		'range': '0, 10',
		'tags': '电影',
		'start': (range - 1) * 20,
		'genres': '动作'
	}

	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
		'X-Requested-With': 'XMLHttpRequest'
	}

	data = urllib.parse.urlencode(data).encode('utf-8')
	request = urllib.request.Request(url=url, data=data, headers=headers)

	return request


def call_request(request):
	response = urllib.request.urlopen(request)
	content = response.read().decode('utf-8')
	return content


def down_response(content, range):
	filename = 'doubanmovie/电影-动作-{}.json'.format(range)
	with open(filename, 'w',encoding='utf-8') as file:
		file.write(content)


if __name__ == '__main__':
	start_page = int(input('输入起始页：'))
	end_page = int(input('输入结束页：'))

	for range in range(start_page, end_page + 1):
		request = create_request(range)
		content = call_request(request)
		down_response(content, range)
